1 Tekrarlanabilir Analiz ve Rapor

1.2 Replication Crisis


2 RStudio ile proje oluştur


3 R Notebook

3.1 R Notebook


3.2 R Notebook


3.3 RNotebook vs RMarkdown

https://youtu.be/zNzZ1PfUDNk


4 R Markdown

4.1 R Markdown: The Definitive Guide

https://bookdown.org/yihui/rmarkdown/

Hem kendi kodları hem de html kodları yazılabilir.


4.2 R Markdown syntax

https://gist.github.com/MinhasKamal/7fdebb7c424d23149140


4.3 Remedy


4.3.1 Remedy


4.6 Use R Markdown

  • render markdown via code

inside R

markdown::markdownToHTML('markdown_example.md', 
'markdown_example.html')

command line

R -e "markdown::markdownToHTML('markdown_example.md',
'markdown_example.html')"

4.7 Use R Markdown

  • pandoc Rstudio integration

command line

export PATH=$PATH:/Applications/RStudio.app/Contents/MacOS/pandoc
R -e "rmarkdown::render('markdown_example.md')"

4.8 Use R Markdown

{r, results='asis'}
 iris %>%
  tibble::as_tibble() %>%
  details::details(summary = 'tibble')

4.9 Use R Markdown

  • Keeping Credentials Secret with Keyrings in R

https://ras44.github.io/blog/2019/01/19/keeping-credentials-secret-with-keyrings-in-r.html

  • How to build a website with Blogdown in R

http://www.storybench.org/how-to-build-a-website-with-blogdown-in-r/


5 Chunk Options

{r global_options, include=FALSE}
knitr::opts_chunk$set(fig.width = 12, fig.height = 8, fig.path = 'Figs/', echo = FALSE, warning = FALSE, message = FALSE, error = FALSE, eval = TRUE, tidy = TRUE, comment = NA)

6 R Markdown örneği

suppressPackageStartupMessages(library("tidyverse"))
suppressPackageStartupMessages(library("survival"))
suppressPackageStartupMessages(library("finalfit"))

7 R Markdown örneği

# data("colon_s")
# colon_s
# 
# writexl::write_xlsx(x = colon_s,
#                     path = "data/colon_s.xlsx",
#                     col_names = TRUE,
#                     format_headers = TRUE)

8 R Markdown örneği

summarytools::what.is(x = lung, 
                      show.all = TRUE, 
                      ignore.size.warn = TRUE)

9 R Markdown örneği

summarytools descriptives


10 R Markdown örneği

recode


11 R Markdown örneği

crosstables


12 R Markdown örneği

survival


13 Güncellemeler olunca kodlar çalışacak mı?


13.1 Paket Kütüphaneleri

  • packrat

  • renv

https://environments.rstudio.com


13.2 Docker

  • docker

13.3 Yeni R sürümleri

  • RSwitch

https://rud.is/rswitch/

  • Using RSwitch

https://rud.is/rswitch/guide/

: scale 30%


14 Yedeklemeyi nasıl yapacağız

14.1 Save Final Data

{r}
saved data after analysis to `mydata.xlsx`.

save.image(file = here::here("data", "mydata_work_space.RData"))

readr::write_rds(x = mydata, path = here::here("data", "mydata_afteranalysis.rds"))

saveRDS(object = mydata, file = here::here("data", "mydata.rds"))

writexl::write_xlsx(mydata, here::here("data", "mydata.xlsx"))

paste0(rownames(file.info(here::here("data", "mydata.xlsx"))), " : ", file.info(here::here("data", "mydata.xlsx"))$ctime)

14.2 GitHub

{r github push}
CommitMessage <- paste("updated on ", Sys.time(), sep = "")
wd <- getwd()
gitCommand <- paste("cd ", 
                    wd,
                    " \n git add . \n git commit --message '",
                    CommitMessage,
                    "' \n git push origin master \n",
                    sep = ""
                    )
system(command = gitCommand,
       intern = TRUE
)

14.3 GitHub Yedekleme

CommitMessage <- paste("updated on ", Sys.time(), sep = "")
wd <- getwd()
gitCommand <- paste("cd ", 
                    wd,
                    " \n git add . \n git commit --message '",
                    CommitMessage,
                    "' \n git push origin master \n",
                    sep = ""
                    )

system(command = gitCommand,
       intern = TRUE
)

15 Her dökümanın sonuna kullandığınız kütüphaneler için atıf yazdırabilirsiniz

{r library citation, echo=TRUE}
citation()

16 Libraries Used

citation()

17 Her dökümanın sonuna oturum detaylarınızı yazdırabilirsiniz

{r session info, echo=TRUE}
sessionInfo()

18 Session Info

sessionInfo()

19 Sonraki Konular

  • RStudio ile GitHub kullanımı

21 Geri Bildirim




  1. Bu bir derlemedir, mümkün mertebe alıntılara linklerle referans vermeye çalıştım.↩︎

LS0tCnRpdGxlOiBSLCBSU3R1ZGlvIHZlIFJNYXJrZG93biBpbGUgVGVrcmFybGFuYWJpbGlyIFJhcG9yXltCdSBiaXIgZGVybGVtZWRpciwgbcO8bWvDvG4gbWVydGViZSBhbMSxbnTEsWxhcmEgbGlua2xlcmxlIHJlZmVyYW5zIHZlcm1leWUgw6dhbMSxxZ90xLFtLl0KYXV0aG9yOiAiW1NlcmRhciBCYWxjxLEsIE1ELCBQYXRob2xvZ2lzdF0oaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLykiCmluc3RpdHV0ZTogIltzZXJkYXJiYWxjaS5jb21dKGh0dHBzOi8vd3d3LnNlcmRhcmJhbGNpLmNvbSkiCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSlgIgpvdXRwdXQ6CiAgcmV2ZWFsanM6OnJldmVhbGpzX3ByZXNlbnRhdGlvbjoKICAgIGluY3JlbWVudGFsOiB0cnVlCiAgICB0aGVtZTogc2t5CiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzCiAgICBjZW50ZXI6IGZhbHNlCiAgICBzbWFydDogdHJ1ZQogICAgdHJhbnNpdGlvbjogZmFkZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIGlnX3dpZHRoOiA3CiAgICBmaWdfaGVpZ2h0OiA2CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgcmV2ZWFsX29wdGlvbnM6CiAgICAgIHNsaWRlTnVtYmVyOiB0cnVlCiAgICAgIHByZXZpZXdMaW5rczogdHJ1ZQogIHJtZHNob3dlcjo6c2hvd2VyX3ByZXNlbnRhdGlvbjoKICBodG1sX25vdGVib29rOgogICAgZmlnX2NhcHRpb246IHllcwogICAgaGlnaGxpZ2h0OiBrYXRlCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IGZsYXRseQogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNQogICAgdG9jX2Zsb2F0OiB5ZXMKICB4YXJpbmdhbjo6bW9vbl9yZWFkZXI6CiAgICBsaWJfZGlyOiBsaWJzCiAgICBuYXR1cmU6CiAgICAgIGJlZm9yZUluaXQ6IFsibWFjcm9zLmpzIiwgImh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyJdCiAgICAgIGhpZ2hsaWdodFN0eWxlOiBnaXRodWIKICAgICAgaGlnaGxpZ2h0TGluZXM6IHRydWUKICAgICAgY291bnRJbmNyZW1lbnRhbFNsaWRlczogZmFsc2UKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgcHJldHR5ZG9jOjpodG1sX3ByZXR0eToKICAgIHRoZW1lOiBsZW9uaWRzCiAgICBoaWdobGlnaHQ6IGdpdGh1YgogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICc1JwogIGh0bWxfZG9jdW1lbnQ6CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBrZWVwX21kOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4LCBmaWcucGF0aCA9ICdGaWdzLycsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGVycm9yID0gRkFMU0UsIGV2YWwgPSBUUlVFLCB0aWR5ID0gVFJVRSwgY29tbWVudCA9IE5BLCBjYWNoZSA9IFRSVUUpCmBgYAoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyB4YXJpbmdhbjo6aW5mX21yKCkKIyBzZXJ2cjo6ZGFlbW9uX3N0b3AoMSkKIyBzZXJ2cjo6ZGFlbW9uX3N0b3AoMikKYGBgCgoKCiMgVGVrcmFybGFuYWJpbGlyIEFuYWxpeiB2ZSBSYXBvcgoKIyMgUmVwbGljYXRpb24gQ3Jpc2lzCgohW10oZmlndXJlcy9yZXBsaWNhdGlvbkNyaXNpcy5wbmcpCmh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JlcGxpY2F0aW9uX2NyaXNpcwoKCi0tLQoKCgojIyBSZXBsaWNhdGlvbiBDcmlzaXMKClshW10oZmlndXJlcy9nZW5lTmFtZXNFeGNlbC5wbmcpXShodHRwczovL2dlbm9tZWJpb2xvZ3kuYmlvbWVkY2VudHJhbC5jb20vYXJ0aWNsZXMvMTAuMTE4Ni9zMTMwNTktMDE2LTEwNDQtNykKCgotLS0KCiMgUlN0dWRpbyBpbGUgcHJvamUgb2x1xZ90dXIKCgoKIVtdKGltYWdlcy9SU3R1ZGlvLU5ld1Byb2plY3QuZ2lmKQoKCgotLS0KCiMgUiBOb3RlYm9vayAgCgoKCiMjIFIgTm90ZWJvb2sgIAoKCiFbXShpbWFnZXMvUk5vdGVib29rMS5naWYpCgotLS0KCiMjIFIgTm90ZWJvb2sgIAoKCiFbXShpbWFnZXMvUk5vdGVib29rMi5naWYpCgoKCgotLS0KCgojIyBSTm90ZWJvb2sgdnMgUk1hcmtkb3duICAKCgo8aWZyYW1lIHdpZHRoPSI1NjAiIGhlaWdodD0iMzE1IiBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL3pOeloxUGZVRE5rIiBmcmFtZWJvcmRlcj0iMCIgYWxsb3c9ImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlIiBhbGxvd2Z1bGxzY3JlZW4+PC9pZnJhbWU+ICAKCgoKaHR0cHM6Ly95b3V0dS5iZS96TnpaMVBmVUROawoKCgoKLS0tCgojIFIgTWFya2Rvd24KCgojIyBSIE1hcmtkb3duOiBUaGUgRGVmaW5pdGl2ZSBHdWlkZQoKaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLwoKSGVtIGtlbmRpIGtvZGxhcsSxIGhlbSBkZSBodG1sIGtvZGxhcsSxIHlhesSxbGFiaWxpci4KCgotLS0KCiMjIFIgTWFya2Rvd24gc3ludGF4CgpodHRwczovL2dpc3QuZ2l0aHViLmNvbS9NaW5oYXNLYW1hbC83ZmRlYmI3YzQyNGQyMzE0OTE0MAoKCjxzY3JpcHQgc3JjPSJodHRwczovL2dpc3QuZ2l0aHViLmNvbS9NaW5oYXNLYW1hbC83ZmRlYmI3YzQyNGQyMzE0OTE0MC5qcyI+PC9zY3JpcHQ+CgoKCi0tLQoKIyMgUmVtZWR5ICAKCls8aW1nIHNyYz0iaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1RoaW5rUi1vcGVuL3JlbWVkeS9tYXN0ZXIvcmVmZXJlbmNlL2ZpZ3VyZXMvdGhpbmtyLWhleC1yZW1lZHkucG5nIiB3aWR0aD0yNTBweD5dKGh0dHBzOi8vZ2l0aHViLmNvbS9UaGlua1Itb3Blbi9yZW1lZHkpCgoKLS0tCgojIyMgUmVtZWR5ICAKCls8aW1nIHNyYz0iaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1RoaW5rUi1vcGVuL3JlbWVkeS9tYXN0ZXIvcmVmZXJlbmNlL2ZpZ3VyZXMvcmVtZWR5X2V4YW1wbGUuZ2lmIiB3aWR0aD01MDBweD5dKGh0dHBzOi8vZ2l0aHViLmNvbS9UaGlua1Itb3Blbi9yZW1lZHkpCgoKCi0tLQoKIyMgVXNlIFIgTWFya2Rvd24KCgpodHRwczovL2FuZHJld2J0cmFuLmdpdGh1Yi5pby9OSUNBUi8yMDE4L3dvcmtmbG93L2RvY3MvMDItcm1hcmtkb3duLmh0bWwKCi0gVHJvdWJsZXNob290aW5nIGluIFIgTWFya2Rvd24KCmh0dHBzOi8vc21pdGhjb2xsZWdlLXNkcy5naXRodWIuaW8vc2RzLXB1YmxpYy9ybWFya2Rvd25fcHJvYmxlbXMuaHRtbAoKCi0tLQoKIyMgVXNlIFIgTWFya2Rvd24KCmh0dHA6Ly9rYnJvbWFuLm9yZy9rbml0cl9rbnV0c2hlbGwvcGFnZXMvUm1hcmtkb3duLmh0bWwKCi0gS25pdHIgJiBSIE1hcmtkb3duCgpodHRwczovL2ticm9tYW4ub3JnL2tuaXRyX2tudXRzaGVsbC9wYWdlcy9vdmVydmlldy5odG1sCgpodHRwczovL2ticm9tYW4ub3JnL2tuaXRyX2tudXRzaGVsbC9wYWdlcy9SbWFya2Rvd24uaHRtbAoKaHR0cHM6Ly9rYnJvbWFuLm9yZy9rbml0cl9rbnV0c2hlbGwvcGFnZXMvbWFya2Rvd24uaHRtbAoKCi0tLQoKIyMgVXNlIFIgTWFya2Rvd24KCi0gcmVuZGVyIG1hcmtkb3duIHZpYSBjb2RlCgoqaW5zaWRlIFIqCgpgYGAKbWFya2Rvd246Om1hcmtkb3duVG9IVE1MKCdtYXJrZG93bl9leGFtcGxlLm1kJywgCidtYXJrZG93bl9leGFtcGxlLmh0bWwnKQpgYGAKCipjb21tYW5kIGxpbmUqCgpgYGAKUiAtZSAibWFya2Rvd246Om1hcmtkb3duVG9IVE1MKCdtYXJrZG93bl9leGFtcGxlLm1kJywKJ21hcmtkb3duX2V4YW1wbGUuaHRtbCcpIgpgYGAKCgotLS0KCiMjIFVzZSBSIE1hcmtkb3duCgoKLSBwYW5kb2MgUnN0dWRpbyBpbnRlZ3JhdGlvbgoKKmNvbW1hbmQgbGluZSoKCmBgYApleHBvcnQgUEFUSD0kUEFUSDovQXBwbGljYXRpb25zL1JTdHVkaW8uYXBwL0NvbnRlbnRzL01hY09TL3BhbmRvYwpgYGAKCgpgYGAKUiAtZSAicm1hcmtkb3duOjpyZW5kZXIoJ21hcmtkb3duX2V4YW1wbGUubWQnKSIKYGBgCgoKCgo8IS0tIC0tLSAtLT4KCjwhLS0gIyMgVXNlIFIgTWFya2Rvd24gLS0+Cgo8IS0tIGh0dHBzOi8vb25wNC5jb20vIC0tPgoKPCEtLSBgYGAgLS0+CjwhLS0gY3N2IHtoZWFkZXJzOiB0cnVlLCB0aXRsZTogIioqRHJhd2luZyBUYWJsZXMgSW4gTWFya2Rvd24qKiJ9IC0tPgo8IS0tIE5hbWUsIFN1cm5hbWUsIEtub3duIEFzLCBBZ2UgLS0+CjwhLS0gTWFyY2VsbywgRGF2aWQsIGNvbGR6ZXJhLCAyMiAtLT4KPCEtLSBPbGVrc2FuZHIsIEtvc3R5bGlldiwgczFtcGxlLCAxOSAtLT4KPCEtLSBOaWtvbGEsIEtvdmHEjSwgTmlLbywgMjAgLS0+CjwhLS0gUmljaGFyZCwgUGFwaWxsb24sIHNob3gsIDI1IC0tPgo8IS0tIE5pY29sYWksIFJlZWR0eiwgZGV2MWNlLCAyMSAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tIGBgYCAtLT4KPCEtLSB7cGdufSAtLT4KPCEtLSBbRXZlbnQgIkJsZWQtWmFncmViLUJlbGdyYWRlIENhbmRpZGF0ZXMiXSAtLT4KPCEtLSBbU2l0ZSAiQmxlZCwgWmFncmViICYgQmVsZ3JhZGUgWVVHIl0gLS0+CjwhLS0gW0RhdGUgIjE5NTkuMTAuMTEiXSAtLT4KPCEtLSBbUm91bmQgIjIwIl0gLS0+CjwhLS0gW1Jlc3VsdCAiMS0wIl0gLS0+CjwhLS0gW1doaXRlICJNaWtoYWlsIFRhbCJdIC0tPgo8IS0tIFtCbGFjayAiUm9iZXJ0IEphbWVzIEZpc2NoZXIiXSAtLT4KCjwhLS0gMS4gZDQgTmY2IDIuIGM0IGc2IDMuIE5jMyBCZzcgNC4gZTQgZDYgNS4gICAgICAgICAgICAgICAgLS0+CjwhLS0gQmUyIE8tTyA2LiBOZjMgZTUgNy4gZDUgTmJkNyA4LiBCZzUgaDYgOS4gIC0tPgo8IS0tIEJoNCBhNiAxMC4gTy1PIFFlOCAxMS4gTmQyIE5oNyAxMi4gYjQgQmY2ICAtLT4KPCEtLSAxMy4gQnhmNiBOaHhmNiAxNC4gTmIzIFFlNyAxNS4gUWQyIEtoNyAxNi4gIC0tPgo8IS0tIFFlMyBOZzggMTcuIGM1IGY1IDE4LiBleGY1IGd4ZjUgMTkuIGY0IGV4ZjQgIC0tPgo8IS0tIDIwLiBReGY0IGR4YzUgMjEuIEJkMyBjeGI0IDIyLiBSYWUxIFFmNiAyMy4gIC0tPgo8IS0tIFJlNiBReGMzIDI0LiBCeGY1KyBSeGY1IDI1LiBReGY1KyBLaDggMjYuICAtLT4KPCEtLSBSZjMgUWIyIDI3LiBSZTggTmY2IDI4LiBReGY2KyBReGY2IDI5LiBSeGY2ICAtLT4KPCEtLSBLZzcgMzAuIFJmZjggTmU3IDMxLiBOYTUgaDUgMzIuIGg0IFJiOCAzMy4gIC0tPgo8IS0tIE5jNCBiNSAzNC4gTmU1IDEtMCAtLT4KPCEtLSBgYGAgLS0+CgoKLS0tCgojIyBVc2UgUiBNYXJrZG93bgoKYGBgCntyLCByZXN1bHRzPSdhc2lzJ30KIGlyaXMgJT4lCiAgdGliYmxlOjphc190aWJibGUoKSAlPiUKICBkZXRhaWxzOjpkZXRhaWxzKHN1bW1hcnkgPSAndGliYmxlJykKYGBgCgoKLS0tCgojIyBVc2UgUiBNYXJrZG93bgoKLSBLZWVwaW5nIENyZWRlbnRpYWxzIFNlY3JldCB3aXRoIEtleXJpbmdzIGluIFIKCmh0dHBzOi8vcmFzNDQuZ2l0aHViLmlvL2Jsb2cvMjAxOS8wMS8xOS9rZWVwaW5nLWNyZWRlbnRpYWxzLXNlY3JldC13aXRoLWtleXJpbmdzLWluLXIuaHRtbAoKLSBIb3cgdG8gYnVpbGQgYSB3ZWJzaXRlIHdpdGggQmxvZ2Rvd24gaW4gUgoKaHR0cDovL3d3dy5zdG9yeWJlbmNoLm9yZy9ob3ctdG8tYnVpbGQtYS13ZWJzaXRlLXdpdGgtYmxvZ2Rvd24taW4tci8KCi0tLQoKIyBDaHVuayBPcHRpb25zCgoKYGBgCntyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4LCBmaWcucGF0aCA9ICdGaWdzLycsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGVycm9yID0gRkFMU0UsIGV2YWwgPSBUUlVFLCB0aWR5ID0gVFJVRSwgY29tbWVudCA9IE5BKQpgYGAKCi0tLQoKIyBSIE1hcmtkb3duIMO2cm5lxJ9pCgpgYGB7cn0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkoInRpZHl2ZXJzZSIpKQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeSgic3Vydml2YWwiKSkKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkoImZpbmFsZml0IikpCmBgYAoKLS0tCgojIFIgTWFya2Rvd24gw7ZybmXEn2kKCgpgYGB7cn0KZGF0YSgiY2FuY2VyIikKY2FuY2VyCiMgZm9yZWlnbjo6d3JpdGUuZm9yZWlnbihkZiA9IGNhbmNlciwKIyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFmaWxlID0gImRhdGEvY2FuY2VyLnNhdiIsCiMgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZmlsZSA9ICJkYXRhL2NhbmNlci5zcG8iLAojICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSA9ICJTUFNTIgojICAgICAgICAgICAgICAgICAgICAgICAgKQpgYGAKCgpgYGB7cn0KZGF0YSgibHVuZyIpCmx1bmcKYGBgCgoKYGBge3J9CiMgZGF0YSgiY29sb25fcyIpCiMgY29sb25fcwojIAojIHdyaXRleGw6OndyaXRlX3hsc3goeCA9IGNvbG9uX3MsCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gImRhdGEvY29sb25fcy54bHN4IiwKIyAgICAgICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IFRSVUUsCiMgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfaGVhZGVycyA9IFRSVUUpCgpgYGAKCgoKLS0tCgojIFIgTWFya2Rvd24gw7ZybmXEn2kKCmBgYHtyIHdhcm5pbmc9RkFMU0V9CnN1bW1hcnl0b29sczo6d2hhdC5pcyh4ID0gbHVuZywgCiAgICAgICAgICAgICAgICAgICAgICBzaG93LmFsbCA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgaWdub3JlLnNpemUud2FybiA9IFRSVUUpCmBgYAoKCi0tLQoKIyBSIE1hcmtkb3duIMO2cm5lxJ9pCgpzdW1tYXJ5dG9vbHMKZGVzY3JpcHRpdmVzCgoKLS0tCgojIFIgTWFya2Rvd24gw7ZybmXEn2kKCnJlY29kZQoKCgotLS0KCiMgUiBNYXJrZG93biDDtnJuZcSfaQoKY3Jvc3N0YWJsZXMKCi0tLQoKIyBSIE1hcmtkb3duIMO2cm5lxJ9pCgoKc3Vydml2YWwKCgotLS0KCiMgR8O8bmNlbGxlbWVsZXIgb2x1bmNhIGtvZGxhciDDp2FsxLHFn2FjYWsgbcSxPwoKCi0tLQoKCiMjIFBha2V0IEvDvHTDvHBoYW5lbGVyaQoKLSBwYWNrcmF0CgotIHJlbnYKCmh0dHBzOi8vZW52aXJvbm1lbnRzLnJzdHVkaW8uY29tCgoKLS0tCgoKIyMgRG9ja2VyCgoKLSBkb2NrZXIKCi0tLQoKIyMgWWVuaSBSIHPDvHLDvG1sZXJpIAoKLSBSU3dpdGNoCgpodHRwczovL3J1ZC5pcy9yc3dpdGNoLwoKLSBVc2luZyBSU3dpdGNoCgpodHRwczovL3J1ZC5pcy9yc3dpdGNoL2d1aWRlLwoKCiFbOiBzY2FsZSAzMCVdKGh0dHBzOi8vcnVkLmlzL3Jzd2l0Y2gvZ3VpZGUvbWVudS1pbmZvLnBuZykKCgoKLS0tCgojIFllZGVrbGVtZXlpIG5hc8SxbCB5YXBhY2HEn8SxegoKCiMjIFNhdmUgRmluYWwgRGF0YQoKCmBgYAp7cn0Kc2F2ZWQgZGF0YSBhZnRlciBhbmFseXNpcyB0byBgbXlkYXRhLnhsc3hgLgoKc2F2ZS5pbWFnZShmaWxlID0gaGVyZTo6aGVyZSgiZGF0YSIsICJteWRhdGFfd29ya19zcGFjZS5SRGF0YSIpKQoKcmVhZHI6OndyaXRlX3Jkcyh4ID0gbXlkYXRhLCBwYXRoID0gaGVyZTo6aGVyZSgiZGF0YSIsICJteWRhdGFfYWZ0ZXJhbmFseXNpcy5yZHMiKSkKCnNhdmVSRFMob2JqZWN0ID0gbXlkYXRhLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YSIsICJteWRhdGEucmRzIikpCgp3cml0ZXhsOjp3cml0ZV94bHN4KG15ZGF0YSwgaGVyZTo6aGVyZSgiZGF0YSIsICJteWRhdGEueGxzeCIpKQoKcGFzdGUwKHJvd25hbWVzKGZpbGUuaW5mbyhoZXJlOjpoZXJlKCJkYXRhIiwgIm15ZGF0YS54bHN4IikpKSwgIiA6ICIsIGZpbGUuaW5mbyhoZXJlOjpoZXJlKCJkYXRhIiwgIm15ZGF0YS54bHN4IikpJGN0aW1lKQoKYGBgCgoKCgojIyBHaXRIdWIgIAoKYGBgCntyIGdpdGh1YiBwdXNofQpDb21taXRNZXNzYWdlIDwtIHBhc3RlKCJ1cGRhdGVkIG9uICIsIFN5cy50aW1lKCksIHNlcCA9ICIiKQp3ZCA8LSBnZXR3ZCgpCmdpdENvbW1hbmQgPC0gcGFzdGUoImNkICIsIAogICAgICAgICAgICAgICAgICAgIHdkLAogICAgICAgICAgICAgICAgICAgICIgXG4gZ2l0IGFkZCAuIFxuIGdpdCBjb21taXQgLS1tZXNzYWdlICciLAogICAgICAgICAgICAgICAgICAgIENvbW1pdE1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgIicgXG4gZ2l0IHB1c2ggb3JpZ2luIG1hc3RlciBcbiIsCiAgICAgICAgICAgICAgICAgICAgc2VwID0gIiIKICAgICAgICAgICAgICAgICAgICApCnN5c3RlbShjb21tYW5kID0gZ2l0Q29tbWFuZCwKICAgICAgIGludGVybiA9IFRSVUUKKQpgYGAKCi0tLQoKIyMgR2l0SHViIFllZGVrbGVtZQoKYGBge3IgZ2l0aHViIHB1c2gsIGVjaG89VFJVRX0KQ29tbWl0TWVzc2FnZSA8LSBwYXN0ZSgidXBkYXRlZCBvbiAiLCBTeXMudGltZSgpLCBzZXAgPSAiIikKd2QgPC0gZ2V0d2QoKQpnaXRDb21tYW5kIDwtIHBhc3RlKCJjZCAiLCAKICAgICAgICAgICAgICAgICAgICB3ZCwKICAgICAgICAgICAgICAgICAgICAiIFxuIGdpdCBhZGQgLiBcbiBnaXQgY29tbWl0IC0tbWVzc2FnZSAnIiwKICAgICAgICAgICAgICAgICAgICBDb21taXRNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICInIFxuIGdpdCBwdXNoIG9yaWdpbiBtYXN0ZXIgXG4iLAogICAgICAgICAgICAgICAgICAgIHNlcCA9ICIiCiAgICAgICAgICAgICAgICAgICAgKQoKc3lzdGVtKGNvbW1hbmQgPSBnaXRDb21tYW5kLAogICAgICAgaW50ZXJuID0gVFJVRQopCmBgYAoKCgoKLS0tCgoKIyBIZXIgZMO2a8O8bWFuxLFuIHNvbnVuYSBrdWxsYW5kxLHEn8SxbsSxeiBrw7x0w7xwaGFuZWxlciBpw6dpbiBhdMSxZiB5YXpkxLFyYWJpbGlyc2luaXoKCgpgYGAKe3IgbGlicmFyeSBjaXRhdGlvbiwgZWNobz1UUlVFfQpjaXRhdGlvbigpCgpgYGAKCgoKCi0tLQoKCiMgTGlicmFyaWVzIFVzZWQKCmBgYHtyIGxpYnJhcnkgY2l0YXRpb24sIGVjaG89VFJVRX0KY2l0YXRpb24oKQpgYGAKCgotLS0KCgoKIyBIZXIgZMO2a8O8bWFuxLFuIHNvbnVuYSBvdHVydW0gZGV0YXlsYXLEsW7EsXrEsSB5YXpkxLFyYWJpbGlyc2luaXogIAoKCmBgYAp7ciBzZXNzaW9uIGluZm8sIGVjaG89VFJVRX0Kc2Vzc2lvbkluZm8oKQpgYGAKCgoKCi0tLQoKCgojIFNlc3Npb24gSW5mbwoKCmBgYHtyIHNlc3Npb24gaW5mbywgZWNobz1UUlVFfQpzZXNzaW9uSW5mbygpCmBgYAoKCi0tLQoKIyBTb25yYWtpIEtvbnVsYXIKCi0gUlN0dWRpbyBpbGUgR2l0SHViIGt1bGxhbsSxbcSxCi0gLi4uCgoKLS0tCgojIFN1bnVtIExpbmtsZXJpCgpodHRwczovL3NiYWxjaS5naXRodWIuaW8vTXlSQ29kZXNGb3JEYXRhQW5hbHlzaXMvUi1NYXJrZG93bi5uYi5odG1sCmh0dHBzOi8vc2JhbGNpLmdpdGh1Yi5pby9NeVJDb2Rlc0ZvckRhdGFBbmFseXNpcy9SLU1hcmtkb3duLmh0bWwKCmh0dHBzOi8vZm9ybXMuZ2xlL1VxR0pCaUFqQjh1TFBSb244CgotLS0KCgojIEdlcmkgQmlsZGlyaW0KCi0gR2VyaSBiaWxkaXJpbSBpw6dpbiB0xLFrbGF5xLFuxLF6OiBfW0dlcmkgYmlsZGlyaW0gZm9ybXVdKGh0dHBzOi8vZ29vLmdsL2Zvcm1zL1lqR1o1REhndFBsUjFSbkIzKV8KCgotLS0KCgo8c2NyaXB0IGlkPSJkc3EtY291bnQtc2NyIiBzcmM9Ii8vaHR0cHMtc2JhbGNpLWdpdGh1Yi1pby5kaXNxdXMuY29tL2NvdW50LmpzIiBhc3luYz48L3NjcmlwdD4KCjxkaXYgaWQ9ImRpc3F1c190aHJlYWQiPjwvZGl2Pgo8c2NyaXB0PgoKLyoqCiogIFJFQ09NTUVOREVEIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTOiBFRElUIEFORCBVTkNPTU1FTlQgVEhFIFNFQ1RJT04gQkVMT1cgVE8gSU5TRVJUIERZTkFNSUMgVkFMVUVTIEZST00gWU9VUiBQTEFURk9STSBPUiBDTVMuCiogIExFQVJOIFdIWSBERUZJTklORyBUSEVTRSBWQVJJQUJMRVMgSVMgSU1QT1JUQU5UOiBodHRwczovL2Rpc3F1cy5jb20vYWRtaW4vdW5pdmVyc2FsY29kZS8jY29uZmlndXJhdGlvbi12YXJpYWJsZXMqLwovKgp2YXIgZGlzcXVzX2NvbmZpZyA9IGZ1bmN0aW9uICgpIHsKdGhpcy5wYWdlLnVybCA9IFBBR0VfVVJMOyAgLy8gUmVwbGFjZSBQQUdFX1VSTCB3aXRoIHlvdXIgcGFnZSdzIGNhbm9uaWNhbCBVUkwgdmFyaWFibGUKdGhpcy5wYWdlLmlkZW50aWZpZXIgPSBQQUdFX0lERU5USUZJRVI7IC8vIFJlcGxhY2UgUEFHRV9JREVOVElGSUVSIHdpdGggeW91ciBwYWdlJ3MgdW5pcXVlIGlkZW50aWZpZXIgdmFyaWFibGUKfTsKKi8KKGZ1bmN0aW9uKCkgeyAvLyBET04nVCBFRElUIEJFTE9XIFRISVMgTElORQp2YXIgZCA9IGRvY3VtZW50LCBzID0gZC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKcy5zcmMgPSAnaHR0cHM6Ly9odHRwcy1zYmFsY2ktZ2l0aHViLWlvLmRpc3F1cy5jb20vZW1iZWQuanMnOwpzLnNldEF0dHJpYnV0ZSgnZGF0YS10aW1lc3RhbXAnLCArbmV3IERhdGUoKSk7CihkLmhlYWQgfHwgZC5ib2R5KS5hcHBlbmRDaGlsZChzKTsKfSkoKTsKPC9zY3JpcHQ+Cjxub3NjcmlwdD5QbGVhc2UgZW5hYmxlIEphdmFTY3JpcHQgdG8gdmlldyB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNxdXMuY29tLz9yZWZfbm9zY3JpcHQiPmNvbW1lbnRzIHBvd2VyZWQgYnkgRGlzcXVzLjwvYT48L25vc2NyaXB0PgoKCi0tLQoKIyDEsGxldGnFn2ltICAKCkNvbXBsZXRlZCBvbiBgciBTeXMuRGF0ZSgpYC4gIAoKU2VyZGFyIEJhbGNpLCBNRCwgUGF0aG9sb2dpc3QgIApkcnNlcmRhcmJhbGNpQGdtYWlsLmNvbSAgCgpodHRwczovL3JwdWJzLmNvbS9zYmFsY2kvQ1YgICAKaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLyAgCmh0dHBzOi8vZ2l0aHViLmNvbS9zYmFsY2kgIApodHRwczovL3R3aXR0ZXIuY29tL3NlcmRhcmJhbGNpCgoKCgo=